package GUI;



import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import Reproductor.Almacen;
import Reproductor.Cancion;

public class InterfazListaReproduccion extends JPanel {
	
	 /**
	  * Declaracion de atributos de la clase InterfazListaReproduccion
	  */
	private static JTable tablaReproduccion;
	private static Almacen almacen;
	private JScrollPane jScrollPanel;
	private PanelReproductor panelReproductor;
	
	 
	private JMenuItem anadirBibliotecaPopup;
	private JPopupMenu popMenuListaReproduccion;
	
	 /**
	  * Inicializacion de la interfaz de la parte de lista de reproduccion
	  * @param panelReproductor: La interfaz del panel reproductor ya creada, para unir ambas.
	  */
	public InterfazListaReproduccion(PanelReproductor panelReproductor){
		this.almacen=InterfazPrincipal.getAlmacen();
		this.panelReproductor=panelReproductor;	
		this.add(getPopMenuListaReproduccion());
		tablaReproduccion=new JTable();		
		jScrollPanel= new JScrollPane();
		
		inicializaInterfaz();
		inicializaEventos();
		actualizaListaReproduccion();
	}
	
	  /**
	  * Inicializacion de la Interfaz
	  */
	public void inicializaInterfaz(){
		this.setLayout(null);
		//Introduce cabecera a la tabla le la lista de reproduccion
		String[] listaRepTitulo = {"Lista de Reproduccion"};
		
		
		DefaultTableModel modelo = new DefaultTableModel(new Object [][] {},listaRepTitulo);
		
		
		tablaReproduccion.setModel(new javax.swing.table.DefaultTableModel(new Object [][] {},listaRepTitulo){
			boolean[] canEdit = new boolean [] {false, false, false, false, false};
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return canEdit [columnIndex];
			}
		});
				
		jScrollPanel.setViewportView(tablaReproduccion);
		jScrollPanel.setSize(250, 500);
		this.add(jScrollPanel);
	}
	
    /**
	  * Inicializacion de las acciones de la interfaz biblioteca:</p>
	  * - Se crea un oyente para la tabla de reproduccion para que, si se pulsa con el 
	  * boton derecho del raton se produzca un evento que permita incluir
	  * la cancion seleccionada en la biblioteca.</br>
	  * -Se crea un oyente para la tabla de reproduccion para que, si se pulsa la tecla 
	  * suprimir teniendo previamente seleccionada una o varias canciones esta o estas se 
	  * eliminen de la lista de reproduccion.
	  */
	public void inicializaEventos(){
		tablaReproduccion.addMouseListener(new MouseListener(){
			@Override
			public void mouseClicked(MouseEvent e) {}
			@Override
			public void mouseEntered(MouseEvent e) {}
			@Override
			public void mouseExited(MouseEvent e) {}
			@Override
			public void mouseReleased(MouseEvent e) {}
			@Override
			public void mousePressed(MouseEvent e) {
				int fila;
				int x = e.getX();
				int y = e.getY();
				if(e.getClickCount()==2 && e.getButton()==1){
					Iterator<Cancion> it = almacen.getListaReproduccion().iterator();
					while(it.hasNext() && !almacen.getListaReproduccion().isEmpty()){
						Cancion cancionAux=it.next();
						cancionAux.setSonando(false);
					}				
					fila=tablaReproduccion.rowAtPoint(e.getPoint());
					System.out.print("repor");
					Cancion c = almacen.getCancionListaReproduccion(fila);
					c.setSonando(true);
					panelReproductor.setReproductor(c);
					panelReproductor.activarReproduccion();
				}
				
				if(e.getButton()==3){ //Si pulsamos el boton secundario
					popMenuListaReproduccion.show(tablaReproduccion, x, y);
					popMenuListaReproduccion.setVisible(true);
					popMenuListaReproduccion.setEnabled(true);
					
				}
				
			}
						
		});
		
		
		tablaReproduccion.addKeyListener(new KeyListener(){
			@Override
			public void keyPressed(KeyEvent e) {
				int col=tablaReproduccion.getSelectedRow();	
				int posCancion=0;
				if(0<=col && col<tablaReproduccion.getRowCount()){			
				if(e.getKeyChar()==e.VK_DELETE){				
					DefaultTableModel temp=(DefaultTableModel)tablaReproduccion.getModel();					
				
					int[] filasSelecionadas = new int[tablaReproduccion.getSelectedRowCount()];
					filasSelecionadas = tablaReproduccion.getSelectedRows();
					ArrayList<Cancion> listaCancionesRepro=(ArrayList<Cancion>)almacen.getListaReproduccion().clone();
					
					///Borra del almacen la cancion tambien de la lista de la tabla
					for(int i=0;i<filasSelecionadas.length;i++){
						if(0<=filasSelecionadas[i]){
							Cancion c=almacen.getListaReproduccion().get(filasSelecionadas[i]);
							if(!c.getSonando()){
								posCancion=listaCancionesRepro.indexOf(c);									
								listaCancionesRepro.remove(posCancion);
							}					
						}
					}
					almacen.setListaReproduccion(listaCancionesRepro);
					actualizaListaReproduccion();
				}
			}
			
			}
			@Override
			public void keyReleased(KeyEvent e) {}
			@Override
			public void keyTyped(KeyEvent e) {}
    	});
			
		
	}
	
    /**
	  * Actualiza la lista de reproduccion de la interfaz a partir de los elementos 
	  * que hay en la lista de reproduccion del almacen.
	  * 
	  */
	public void actualizaListaReproduccion(){
		DefaultTableModel modelo = (DefaultTableModel) tablaReproduccion.getModel();
		
		//TODO vaciar
		int numFilas = modelo.getRowCount();
		for(int i=0;i<numFilas;i++){
			modelo.removeRow(0);
		}
		
		Iterator<Cancion> it = almacen.getListaReproduccion().iterator();	
		int i=0;
		while(it.hasNext() && !almacen.getListaReproduccion().isEmpty()){
			Cancion aux=it.next();
            Object nuevo []={""};
            modelo.addRow(nuevo);
            tablaReproduccion.setValueAt(aux.getTitulo(), i, 0);
            i++;
		}
		
	}
	
	/**
 	  * Permite agnadir a la biblioteca canciones existentes
 	  * en la lista de reproduccion
 	  * Esto viene a partir de que se produjo un evento mediante click
 	  * derecho del raton encima de una cancion.
 	  * Gracias a ello se habilito el popMenuBiblioteca, que muestra un 
 	  * mensaje y se crea otro oyente. En caso de que se produzca el evento
 	  * se agnadira la cancion a la biblioteca finalmente. 
 	  */
	public JPopupMenu getPopMenuListaReproduccion(){
		if(popMenuListaReproduccion==null){
			popMenuListaReproduccion=new JPopupMenu();

			if(anadirBibliotecaPopup==null){
				anadirBibliotecaPopup=new JMenuItem();
				anadirBibliotecaPopup.setText("Incluir en la Biblioteca");
				anadirBibliotecaPopup.addActionListener(new ActionListener(){

					
					
					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						int[] filasSelecionadas = new int[tablaReproduccion.getSelectedRowCount()];
						filasSelecionadas = tablaReproduccion.getSelectedRows();
						
						for(int i=0;i<tablaReproduccion.getSelectedRows().length;i++){	
							Cancion cancionAux=almacen.getCancionListaReproduccion(filasSelecionadas[i]);
							almacen.anadirBiblioteca(cancionAux);

						}
						
						InterfazPrincipal.actualizaBibloteca();
						
					}
				});			
			}
			popMenuListaReproduccion.add(anadirBibliotecaPopup);
		}
		return popMenuListaReproduccion;
	}
	
}
